/*用流和管道重做p7：
    1)和p7一样：在p4-module.js中加上用户类CUser，其有属性用户名，exports之。
    2）和p7一样：在本文件中引入用户类，实例化一个对象,其用户名为：lyshsd
    3) 和p7一样：监听一个“用户注册“事件，在用户注册事件响应函数中，创建目录,目录名使用注册用户的名字。用户lyshsd来注册，用emit触发”用户注册“事件。
    4）用流重写文件写入：监听一个”用户更新购物车“事件，在响应函数中，把购物车数据写入：用户名/cart.txt。触发事件。
        注意，在这里，可以先写程序产生一个数据量大一些的购物车数据，比如有1000个商品信息的购物车。

    5）用流生写文件读取：监听一个”用户读取购物车“事件，在响应函数中，读取用户名目录下的cart.txt，并在终端输出（console.log)。触发事件。

    6）以管道重写：从cart.txt读取，然后写入cart1.txt和cart2.txt。

    7）就购物车数据，你认为同步/异步和流，哪种方式比较恰当。
*/

let className = require("./p4-module")
let fs = require('fs')
let CN = new className.CUser("lyshsd")
let e = require("events");
let eEmitter = new e.EventEmitter();

//创建目录
eEmitter.addListener("创建目录", creat)

function creat() {
    fs.mkdir(CN.用户名, function() {})
}
eEmitter.emit("创建目录")

//用户更新事件

// var rs = fs.createReadStream(CN.用户名 + ".txt")
// var ws = fs.createWriteStream(CN.用户名 + '/cart.txt'); // 创建可写流
// rs.pipe(ws);

const rs = fs.createReadStream(CN.用户名 + ".txt");
const ws = fs.createWriteStream(CN.用户名 + '/cart.txt', {
    encoding: "utf-8"
});

rs.on("data", (chunk) => {
    ws.write(chunk);
});

rs.on("close", () => {
    console.log("文件流读取完成");
    ws.end();
}).on("error", () => {
    console.log("文件流读取出错");
});

ws.on("close", () => {
    console.log("文件写入完成");
})

//用户读取
eEmitter.addListener("购物车读取", readFil)

function readFil() {
    var rdata = '';
    // 创建可读流
    var readerStream = fs.createReadStream(CN.用户名 + '/cart.txt');
    // 设置编码为 utf8。
    readerStream.setEncoding('UTF8');
    // 处理流事件 --> data, end, and error
    readerStream.on('data', function(chunk) {
        rdata += chunk;
    });
    readerStream.on('end', function() {
        console.log(rdata);
    });
    readerStream.on('error', function(err) {
        console.log(err.stack);
    });
    console.log("购物车读取完毕");
}
eEmitter.emit("购物车读取")

//用管写
// 创建一个可读流
var readerStream = fs.createReadStream(CN.用户名 + '/cart.txt');

// 创建一个可写流
var writerStream1 = fs.createWriteStream(CN.用户名 + '/cart1.txt');
var writerStream2 = fs.createWriteStream(CN.用户名 + '/cart2.txt');

readerStream.pipe(writerStream1);
readerStream.pipe(writerStream2);